#include <io.h>
#include <stdio.h>
#include <string.h>
#include "udp.h"
#include "../utility.h"


static alt_u8* 		payload;		//!< Адрес начала полезной информации пакета
static alt_u16 		rx_length;
static alt_u16		tx_sport;		//!< Порт отправителя
static alt_u16		tx_dport;		//!< Порт получателя

static alt_u16		rx_sport;		//!< Порт отправителя из последнего обработанного пакета

static alt_u16 		open_port;		//!< Входной порт, по которому можно принять пакет

// Метод задающий
alt_u8 udp_set_oport(alt_u16 port)
{
	open_port	=	hton16(port);

	return 0;
}

// Зададим порт назначения
alt_u8 udp_set_dport(alt_u16 port)
{
	tx_dport	=	hton16(port);
//	tx_dport	=	hton16(ntoh16(tx_dport) + 1);
	return 0;
}

// Зададим порт источника
alt_u8 udp_set_sport(alt_u16 port)
{
	alt_u8 		err 	= 0;

	tx_sport	=	hton16(port);
	if (port == 703)
	{
		err = 1;
	}
	return 0;
}

// Зададим порт назначения
alt_u16 udp_get_rx_sport()
{
	return hton16(rx_sport);
}


// Метод формирующий заголовок, по заданному адресу
alt_u8  udp_create_head(alt_u8* header, alt_u16 data_size)
{
	alt_u8		err 		= 0;
	alt_u16 	tst_dport 	= 0;

	udp_header_t udp_header;
	udp_header_t udp_header_tst;

	udp_header.sport		= tx_sport;
	tst_dport				= ntoh16(tx_dport);
	udp_header.dport		= tx_dport;
	data_size 				= data_size + UDP_HEAD_SIZE;
	udp_header.length		= hton16(data_size);
	udp_header.checksumm 	= 0;

	memcpy((void*)header, (void*)&udp_header, sizeof(udp_header_t));

//	memcpy((void*)&udp_header_tst, (void*)header, sizeof(udp_header_t));
//	if (udp_header_tst.dport != udp_header.dport)
//	{
//		err = 1;
//	}
	//usleep(300000);
	return 0;
}


// Метод разбирающий заголовок, по заданному адресу
alt_u8  udp_header_parser(alt_u8* header)
{
	alt_u8			err = 0;
	udp_header_t*	udp_header;

	udp_header	= (udp_header_t*)header;

	if (udp_header->dport != open_port)
	{
		err = 1;
	}

	if (err == 0)
	{
		rx_sport	= udp_header->sport;
		rx_length	= udp_header->length - UDP_HEAD_SIZE;
		payload = header + UDP_HEAD_SIZE;
	}


	return err;
}
